const knex = require('./knex')
const calcOffsetLength = require('../utils/methods/calcOffsetLength')

// 公共 sql 查询
class Base {
    constructor(props) {
        this.table = props
    }
    /**
     * 查询
     * */
    // 查询整表数据
    knexAll() {
        return knex(this.table).select()
    }
    // 查询整表数据总条数
    knexAllCount() {
        return knex(this.table).count()
    }
    // 查询指定条件数据条数
    knexFiledCount(whereFiled) {
        return knex(this.table).where(whereFiled).count()
    }
    // 指定字段查询表行数据
    knexSelectFiledRow(whereField) {
        return knex(this.table).select().where(whereField)
    }
    // 指定字段查询表行数据 - 分页倒序
    knexSelectFiledRowLimitDesc(whereField, pageField, orderKey) {
        return knex(this.table).select()
            .offset(calcOffsetLength(pageField))
            .orderBy(orderKey, 'desc')
            .limit(pageField.currentSize)
            .where(whereField)
    }
    // 指定字段查询指定列数据
    knexSelectFiledColumn(whereFiled, columnFiled) {
        return knex(this.table).select().where(whereFiled).column(columnFiled)
    }
    // 无条件查询 - 分页倒序
    knexAllDescLimitSelect(pageField, orderKey) {
        return knex(this.table).select()
            .offset(calcOffsetLength(pageField))
            .orderBy(orderKey, 'desc')
            .limit(pageField.currentSize)
    }
    // 单字段模糊查询
    knexLikeSelect(likeName, likeValue) {
        return knex(this.table).select().where(likeName, 'like',`%${likeValue}%`)
    }
    // 单字段模糊查询 - 分页倒序
    knexLikeSelectLimitDesc(likeName, likeValue, pageField, orderKey) {
        return knex(this.table).select()
            .offset(calcOffsetLength(pageField))
            .orderBy(orderKey, 'desc')
            .limit(pageField.currentSize)
            .where(likeName, 'like',`%${likeValue}%`)
    }
    // 单字段模糊查询加其他字段匹配
    knexLikeAndOtherSelect(likeName, likeValue, whereField) {
        return knex(this.table).select().where(likeName, 'like',`%${likeValue}%`).where(whereField)
    }
    // 单字段模糊查询 - 分页倒序
    knexLikeAndOtherSelectLimitDesc(likeName, likeValue, whereField, pageField, orderKey) {
        return knex(this.table).select()
            .offset(calcOffsetLength(pageField))
            .orderBy(orderKey, 'desc')
            .limit(pageField.currentSize)
            .where(whereField)
            .where(likeName, 'like',`%${likeValue}%`)
    }

    /**
     * 新增
     * */
    // 新增数据
    insert(insertData) {
        return knex(this.table).insert(insertData)
    }

    /**
     * 更新
     * */
    // 指定字段更新数据
    update(updateField, updateData){
        return knex(this.table).update(updateData).where(updateField)
    }

    /**
     * 删除
     * */
    // 指定字段删除数据
    delete(deleteFiledKey, deleteFiledValue){
        return knex(this.table).del().where(deleteFiledKey, deleteFiledValue)
    }
}

module.exports = Base
